import pymysql
from DBUtils.PooledDB import PooledDB
from config import MYSQL_CONFIG


class MysqlPool(object):
    """mysql连接池"""

    # 连接池对象
    __pool = None

    def __init__(self):
        """初始化, 连接数据库"""
        if MysqlPool.__pool is None:
            MysqlPool.__pool = PooledDB(
                creator=pymysql,
                mincached=1,  # 启动时开启的空连接数量
                maxcached=6,  # 连接池最大可用连接数量
                maxconnections=6,  # 连接池允许连接最大数量
                host=MYSQL_CONFIG["host"],
                port=MYSQL_CONFIG["port"],
                user=MYSQL_CONFIG["user"],
                passwd=MYSQL_CONFIG["password"],
                db=MYSQL_CONFIG["db"],
                use_unicode=True,
                charset="utf8",
                blocking=True,  # 设置伟True 当连接数量过载时，其余的连接处于等待，设置False，抛异常
            )
            print("建立mysql连接池....")
        # 连接数据库
        self.conn = MysqlPool.__pool.connection()
        self.cursor = self.conn.cursor(cursor=pymysql.cursors.DictCursor)

    def get_all(self, sql, param=None):
        """
        @summary: 执行查询，并取出所有结果集
        @param sql:查询ＳＱＬ，如果有查询条件，请只指定条件列表，并将条件值使用参数[param]传递进来
        @param param: 可选参数，条件列表值（元组/列表）
        @return: result list(字典对象)/boolean 查询到的结果集
        """
        if param is None:
            count = self.cursor.execute(sql)
        else:
            count = self.cursor.execute(sql, param)
  
        result = self.cursor.fetchall()
        
        return result

    def get_one(self, sql, param=None):
        """
        @summary: 执行查询，并取出第一条
        @param sql:查询ＳＱＬ，如果有查询条件，请只指定条件列表，并将条件值使用参数[param]传递进来
        @param param: 可选参数，条件列表值（元组/列表）
        @return: result list/boolean 查询到的结果集
        """
        if param is None:
            count = self.cursor.execute(sql)
        else:
            count = self.cursor.execute(sql, param)
       
        result = self.cursor.fetchone()
        
        return result

    def __query(self, sql, param=None):
        if param is None:
            count = self.cursor.execute(sql)
        else:
            count = self.cursor.execute(sql, param)
        return count

    def update(self, sql, param=None):
        """
        @summary: 更新数据表记录
        @param sql: ＳＱＬ格式及条件，使用(%s,%s)
        @param param: 要更新的  值 tuple/list
        @return: count 受影响的行数
        """
        return self.__query(sql, param)

    def insert(self, sql, param=None):
        """
        @summary: 更新数据表记录
        @param sql: ＳＱＬ格式及条件，使用(%s,%s)
        @param param: 要更新的  值 tuple/list
        @return: count 受影响的行数
        """
        return self.__query(sql, param)

    def delete(self, sql, param=None):
        """
        @summary: 删除数据表记录
        @param sql: ＳＱＬ格式及条件，使用(%s,%s)
        @param param: 要删除的条件 值 tuple/list
        @return: count 受影响的行数
        """
        return self.__query(sql, param)

    def begin(self):
        """
        @summary: 开启事务
        """
        self.conn.begin()

    def end(self, option='commit'):
        """
        @summary: 结束事务
        """
        if option == 'commit':
            self.conn.commit()
        else:
            self.conn.rollback()

    def dispose(self):
        """
        @summary: 释放连接池资源
        """
        self.cursor.close()
        self.conn.close()

    def __del__(self):
        """
        @summary: 释放连接池资源
        """
        self.cursor.close()
        self.conn.close()
